class Vue {
    constructor(options = {}) {
        // 1. 初始化参数处理
        const { el, data } = options;
        this.$options = options;
        this.$el = typeof el === 'string'
            ? document.querySelector(el) : el;
        this.$data = data;

        // 2. 数据代理
        this.proxy_handler(this.$data);

        // 3. 数据劫持
        new Observer(this.$data);

        // 4. 编译模板
        new Compiler(this);
    }

    /**
     * 数据代理
     * @param {object} data 
     */
    proxy_handler(data) {
        if (Utils.is2type(data, "object")) {
            // 获取data中所有可枚举的属性
            for (const key of Object.keys(data)) {
                Object.defineProperty(this, key, {
                    enumerable: true,
                    configurable: true,
                    set(newVal) {
                        if (newVal !== data[key]) data[key] = newVal;
                    },
                    get() {
                        return data[key];
                    }
                })
            }
        }
    }
}
